←
▼
▲
Sub BinaryArray::ReDim_( UBound as integer )
バイナリ配列の要素数(=バイトサイズ)を変更します。 ReDim Preserve と同じです。
【引数】
UBound
新しい配列の最大要素番号
ReDim の末尾にアンダースコアが付いています。
(ReDim は予約語であるため。)
(src)
←
▼
▲
Sub BinaryArray::Load( Path as string )
ファイルの内容を、バイナリ配列に入力します。
【引数】
Path
ファイルのパス
バイナリ配列に元々入っていた内容は無くなります。
関連
←
▼
▲
Sub BinaryArray::Save( Path as string )
バイナリ配列の内容を、ファイルに出力します。
【引数】
Path
ファイルのパス
Dim i
Dim bin : Set bin = new BinaryArray
bin.ReDim_ &hFF
For i=0 To &hFF : bin(i) = i : Next
bin.Save "a.bin"
サンプル
←
▼
▲
Function BinaryArray::Read( Offset as integer, Length as integer ) as array of Byte
バイナリ配列の内容の一部を、Byte 配列にして返します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
配列の中で抽出する部分の長さ(バイト)。 -1 = 最後まで
Length
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
返り値
配列の内容の一部を抽出した Byte 配列
返り値に、文字列関数 LeftB, MidB, RightB, LenB, AscB, ChrB を使うことができます。
返り値に対して + 演算子は使えませんが、MidB( ByteArray, 1 ) などで String 型に変換
すれば、+ 演算子が使えます。
サンプル
binary = bin.Read( &h10, &h28 )
echo AscB( MidB( binary, 3, 1 ) )
サンプル
(src)
関連
←
▼
▲
Sub BinaryArray::Write( Offset as integer, Length as integer, ByteArray as variant )
バイナリ配列の内容の一部を、変更します。
【引数】
ByteArray
変更内容が格納された文字列(UTF-16)、または配列、または数値
Length
配列の中で変更する部分の長さ(バイト)。 -1 = ByteArray 引数の全体
配列の中で変更する部分の先頭の位置。 配列の先頭から = 0
Offset
Offset = 0 または Empty にすると、配列の先頭からになります。
Length = -1 または Empty にすると、配列の最後までになります。
サンプル
bin.Write 0, Empty, Array( &h42, &h4D )
サンプル
bin.Write 0, 2, ChrB( &h42 ) + ChrB( &h4D )
bin.Write 1, 1, &h4D
関連
(src)
←
▼
▲
Function BinaryArray::ReadStruct( Offset as integer, out_Dic as dictionary,
FormatArray as integer ) as integer
バイナリ配列の内容の一部をリードした内容を、構造化した辞書を取得します。
【引数】
Offset
配列の中で抽出する部分の先頭の位置。 配列の先頭から = 0
(出力) 数値の辞書。 キーは FormatArray に指定したもの。
out_Dic
返り値
抽出した部分のバイナリの大きさ(バイト)
サンプル
Dim bin, out, size
bin.Write &h10, Empty, Array( &h12, &h34, &h56, &h78, &h9A, &hBC, &hDE )
size = bin.ReadStruct( &h10, out, Array( "a", vbByte, "b", vbInteger+vbArray, 3 ) )
'// out("a") = &h12
'// out("b")(0) = &h5634
'// out("b")(1) = &h9A78
'// out("b")(2) = &hDEBC
バイナリ配列から抽出する部分の型の集合 (下記)
FormatArray
(src)
FormatArray 引数
out_Dic (辞書型) に格納するキーの名前と、値の型を、順番に並べた配列を指定します。
vbInteger などの型に +vbArray したときは、配列をリードします。 このとき、更に配列の
要素数を指定してください。 要素数を -1 にすると、ファイルの最後までリードします。
下記の c は、ADODBConsts です。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
* + vbArray
配列。 vbByte などの型に vbArray をプラスしてください。
FormatArray には、配列の要素数も指定してください。
要素数を -1 にすると、ファイルの最後までリードします。
&h10 out
"a", vbByte, "b", vbInteger+vbArray, 3
関連
←
▼
▲
Sub BinaryArray::WriteStruct( Offset as integer, FormatAndDataArray as array )
構造化した配列を使って、バイナリ配列の内容の一部に、バイナリーデータをライトします。
【引数】
Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
バイナリ配列へライトする部分の型とライトする値の集合 (下記)
FormatAndDataArray
サンプル
bin.WriteStruct &h40, Array( vbByte, &h12, vbInteger, Array( &h5634, &h9A78, &hDEBC ) )
'// bin = 0x0040 : 12 34 56 78 9A BC DE
関連
(src)
FormatAndDataArray 引数
「値の型」 要素と、「値、または、値を並べた配列」 要素を繰り返す配列を指定します。
vbByte
1バイト、符号なし、0〜255
vbInteger
2バイト、符号あり、-32768〜32767, &h0000〜&hFFFF
vbInteger + c.Unsigned
2バイト、符号なし、Long型、0〜65535
vbLong
4バイト、符号あり、-2147483648〜2147483647、&h10000〜&hFFFFFFFF
バイナリ配列 bin の 0x40 の位置に、vbByte型(8ビット整数型)の 0x12 と、vbInteger型(16ビット
整数型)の 0x5634, 0x9A78, 0xDEBC を格納します。
バイナリ配列 bin の 0 の位置に、vbByte型(8ビット整数型)の 0x12、0x34、0x56、0x78
を格納します。
bin.WriteStruct 0, Array( vbByte, Array( &h12, &h34, &h56, &h78 ) )
'// bin = 0x0000 : 12 34 56 78
←
▼
▲
Sub BinaryArray::WriteFromBinaryArray( WriteOffset as integer,
ReadBinaryArray as BinaryArray, ReadOffset as integer, Size as integer )
バイナリ配列の一部を別のバイナリ配列に、高速にコピーします。
【引数】
Me
コピー先となるバイナリ配列
Me の中で変更する範囲の先頭位置。 配列の先頭から = 0
WriteOffset
(src)
ReadBinaryArray
ReadOffset
Size
コピー元となるバイナリ配列
ReadBinaryArray の中の範囲の先頭位置。 配列の先頭から = 0
コピーするサイズ(バイト), -1=最後まで
ReadBinaryArray のサイズより大きな値を Size 引数に指定したときは、最後までコピーします。
←
▼
▲
Sub BinaryArray::WriteFromDump( in_Offset as integer, in_Dump as string )
文字列にダンプされたバイナリーデータを、バイナリ配列の内容の一部に、ライトします。
【引数】
in_Offset
バイナリ配列の中で変更する範囲の先頭位置。 配列の先頭から = 0
バイナリーデータをダンプした文字列
in_Dump
サンプル
→ System.vbs
ソース
bin.WriteFromDump %h10, "0x05 | 0x14, 0x1234, 0x98765432"
'// bin = 0x0010 : 15 34 12 32 54 76 98
バイナリ配列 bin の 0 の位置に、vbByte型(8ビット整数型)の 0x12、0x34、0x56、0x78
を、格納します。
bin.WriteFromDump 0, "12 34 56 78"
'// bin = 0x0000 : 12 34 56 78
in_Dump 引数の中の、16進数と | 演算子以外は無視されます。 16進数は、接頭辞 0x を付けるか、
接頭辞を付けないでください。 | 演算子は、論理和です。
無視される文字を除き、16進数が連続すると次のデータであるとして処理します。
16進数の桁数がに応じて、整数のビット数が異なります。 2, 4, 8 桁なら、リトル エンディアンの
8, 16, 32 ビット整数になります。
テスト
T_Binary_FromDump
→ T_Binary.vbs
←
▼
▲
Function BinaryArray::Compare( ThanBinary as BinaryArray )
バイナリ配列を比較します。
【引数】
ThanBinary
比較対象のバイナリ配列
テスト
→ T_Binary.vbs
→ System.vbs
ソース
返り値
一致=0、StrComp と同じ
関連
←
▼
▲
Sub BinaryArray::SwapEndian( Offset as integer, Size as integer, SwapUnitSize as integer )
バイナリ配列の一部のエンディアンを逆にします。
【引数】
Offset
エンディアンを逆にする範囲の先頭オフセット
エンディアンを逆にする範囲のサイズ(バイト)
Size
サンプル
'// bin = 12 34 56 78 9A BC DE
bin.SwapEndian &h2, &h4, 2
'// bin = 12 56 34 9A 78 BC DE
バイナリ配列 bin の 0x2 の位置から始まる 4バイトの範囲を、2バイト単位(2バイト整数)で逆にします。
SwapUnitSize
逆にする単位
テスト
→ T_Binary.vbs
→ System.vbs
ソース
←
▼
▲
Sub BinaryArray::ToEmpty()
配列を空にします。 配列要素数は 0 になります。
←
▼
▲
←
▼
▲
<BinaryArray size="6">
FF FE 6F 30 80 30
</BinaryArray>
出力例:
(src)
←
▼
▲
echo ReadBinaryFile( "Sample.zip" ).MD5
バイナリー・データ(配列の全体)に対する ハッシュ値。
テスト
サンプル
ソース
→ System.vbs
→ T_Binary.vbs
→ MD5
関連
MD5 ハッシュ値は、0〜9, a〜f の文字が32文字の文字列になります。
SHA-1 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
SHA-256 ハッシュ値は、0〜9, a〜f の文字が64文字の文字列になります。
Property Get BinaryArray::SHA1() as string
キーワード:
Property Get BinaryArray::SHA256() as string
SHA-256, SHA-384, SHA-512, RIPEMD-160 は、Windows Vista 以降で使えます。
Property Get BinaryArray::SHA384() as string
Property Get BinaryArray::SHA512() as string
SHA-384 ハッシュ値は、0〜9, a〜f の文字が96文字の文字列になります。
SHA-512 ハッシュ値は、0〜9, a〜f の文字が128文字の文字列になります。
RIPEMD-160 ハッシュ値は、0〜9, a〜f の文字が40文字の文字列になります。
Property Get BinaryArray::RIPEMD160() as string
→ ハッシュ値
5c1d447971bc0c49f09b2e965ac4ed37
… 表示例
文字列からハッシュ値を得る場合
→ PowerShell - MD5を計算する
ファイルの内容が異なれば、ハッシュ値も異なります。 内容が異なるのにハッシュ値が
同じになる(衝突する)確率はわずかにありますが、実用的には問題ありません。
ファイルの内容のごく一部だけ変えたときは、衝突しません。 なぜなら、衝突させるには、
ハッシュ アルゴリズムによって決まる法則で、ファイルの内容の全体を合わせる必要が
あるからです。
なお、ファイルのハッシュ値は、
でも確認できます。
注意
バイナリ ファイルのハッシュ値を計算するときは、
をお使い
ください。 ReadBinaryFile は、データをすべてリードしてからハッシュ値を計算
するため、メモリー不足が発生する可能性があります。
←
▼
▲
Sub Main()
Set c = g_VBS_Lib
path = InputPath( "zipファイルのパス >", c.CheckFileExists )
echo GetVersionString( path )
End Sub
Dim g_VersionDataBase : g_VersionDataBase = Array(_
"c28bae2972d4e9c9f90ed1861f0b8002", "vbslib, 4.00, 2012-07-02",_
"700af264a9f00733b4d26f0407625d5b", "vbslib, 4.01, 2013-02-14" )
Function GetVersionString( Path )
If IsArray( g_VersionDataBase ) Then _
Set g_VersionDataBase = Dict( g_VersionDataBase )
value_of_MD5 = ReadBinaryFile( Path ).MD5
If g_VersionDataBase.Exists( value_of_MD5 ) Then
GetVersionString = g_VersionDataBase( value_of_MD5 )
Else
GetVersionString = "Unknown"
End If
End Function
zip などのパッケージ・ファイルのバージョンを MD5 から判定するソース・コードのサンプル
を示します。
関連
←
▼
▲
Set bin = new_BinaryArrayFromBase64( "EjRWeA==" )
echo bin.Base64
バイナリー・データ(配列の全体)に対する Base64 でエンコードされた文字列。
サンプル
ソース
→ System.vbs
テスト
→ T_Binary.vbs
Test_of_Base64
関連
→ Base64
参考
←
▼
▲
バイナリー・データを指定した文字コードセットの文字列とし、VBScript の文字列を返します。
ソース
→ System.vbs
テスト
→ T_Binary.vbs
T_Binary_TextCharacterSet
関連
文字コードセット一覧
Set shift_JIS_bin = new_BinaryArray( Array( &h8A, &hBF, &h8E, &h9A ) )
Assert shift_JIS_bin.Text( "Shift-JIS" ) = "漢字"
サンプル
VBScript の文字列を指定した文字コードセットに変える
←
▼
▲
echo GetHashOfFile( "A.bin", "MD5" )
Function GetHashOfFile( in_Path as string, in_HashType as string ) as string
ファイルのハッシュ値を計算します。 内部で ADODB か Power Shell を使います。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
内部の ADODB でメモリー不足が発生したら、Power Shell を使用します。
関連
←
▼
▲
echo GetHashPS( "A.bin", "MD5" )
Function GetHashPS( in_Path as string, in_HashType as string ) as string
ファイルのハッシュ値。 内部で Power Shell 使用。
【引数】
in_Path
in_HashType
ハッシュ値を計算するファイルのパス
ハッシュ値の種類
返り値
ファイルのハッシュ値
サンプル
ソース
in_HashType 引数に指定できる値は、"MD5", "SHA1", "SHA256", "SHA384", "SHA512",
"RIPEMD160" です。
→ System.vbs
←
▼
▲
→ RIFF 形式
WAV, AVI などの形式の一部にあたる、ツリー構造を持ったチャンクによって構成される
バイナリーデータ形式をリードします。
参考
Function OpenForReadRIFF( in_Path as string ) as RIFF_Reader
RIFF 形式バイナリーファイルのリードを開始します。
【引数】
入力ファイルのパス
in_Path
返り値
内容をリードするときに使うオブジェクト
Set bin = OpenForReadRIFF( "riff.bin" )
Set chunk = bin.ReadFirstChild() '// chunk as RIFF_ChunkClass
Assert chunk.FourCC = "Set "
Assert bin.Stack( 0 ).FourCC = "Root"
Assert bin.Stack( 1 ).FourCC = "Set "
Set chunk = bin.ReadFirstChild()
Assert chunk.FourCC = "Elem"
Assert chunk.Size = 5
Assert not chunk.IsExistChild
Assert not chunk.IsExistNextSibling
bin.ReadStruct data, Array( _
"a", vbByte+vbArray, 3, "b", vbInteger ) )
Assert data("a")(0) = &h41
Assert data("a")(1) = &h42
Assert data("a")(2) = &h43
Assert data("b") = &h4544 '// リトルエンディアン
bin.ReturnToParent
Set chunk = bin.ReadNextSibling()
Assert chunk.FourCC = "Elm2"
サンプル
RIFF( 'Root'
LIST( 'Set '
'Elem'( &h41, &h42, &h43, &h44, &h45 )
)
'Elm2'( &h58, &h59, &h5A )
)
上記のスクリプトは、下記のツリー構造をたどっています。
→ System.vbs
ソース
テスト
→ T_Binary.vbs
←
▼
▲
Function RIFF_Reader::SeekChunkByIndexes( in_Empty as Empty,
in_Indexes0_Array as array of integer ) as RIFF_ChunkClass
インデックス番号で指定したチャンクにジャンプして、リードします。
【引数】
in_Empty
Empty = ルート チャンクからたどる
テスト
→ T_Binary.vbs
T_RIFF_SeekChunkByIndexes
ソース
→ System.vbs
リードしたチャンクに関する情報
返り値
in_Indexes0_Array
インデックス番号の配列
RIFF チャンク
LIST チャンク
要素チャンク
要素チャンク
要素チャンク
要素チャンク
サンプル
Set chunk = a_RIFF.SeekChunkByIndexes( Empty, Array( 2, 0 ) )
Array( )
in_Indexes0_Array 引数の位置関係:
Array( 0 )
Array( 1 )
Array( 2 )
Array( 2, 0 )
Array( 2, 1 )
←
▼
▲
Function RIFF_Reader::ReadFirstChild() as RIFF_ChunkClass
現在位置にあるリスト チャンクの、子チャンクのヘッダーをリードします。
【引数】
返り値
リードした子チャンクに関する情報
::IsExistChild = False のときに呼び出すとエラーになります。
←
▼
▲
Function RIFF_Reader::ReadNextSibling() as RIFF_ChunkClass
現在位置の次の兄弟チャンクのヘッダーをリードします。
【引数】
返り値
リードした兄弟チャンクに関する情報
::IsExistNextSibling = False のときに呼び出すとエラーになります。